/*
 * Copyright (C) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup Drm
 * @{
 *
 * @brief 提供数字版权保护能力的API。
 * @kit Drm.
 * @since 11
 * @version 1.0
 */

/**
 * @file native_drm_common.h
 *
 * @brief 定义DRM数据类型
 * @library libnative_drm.z.so
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */

#ifndef NATIVE_DRM_COMMON_H
#define NATIVE_DRM_COMMON_H

#include <stdint.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
  * @brief 监听类型。
 * @syscap SystemCapability.Multimedia.Drm.Core.
  * @since 11
  * @version 1.0
*/
typedef enum DRM_ListenerType {
    /**
     * DRM基础事件
     */
    LISTENER_DRM_EVENT = 200,
    /**
     * 设备证书请求事件
     */
    LISTENER_PROVISION_REQUIRED = 201,
    /**
     * 密钥请求事件
     */
    LISTENER_KEY_REQUIRED = 202,
    /**
     * 密钥过期事件
     */
    LISTENER_KEY_EXPIRED = 203,
    /**
     * 第三方定义事件
     */
    LISTENER_VENDOR_DEFINED = 204,
    /**
     * 密钥过期更新事件
     */
    LISTENER_EXPIRATION_UPDATE = 206,
  } DRM_ListenerType;

/**
 * @brief 内容保护级别类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef enum DRM_ContentProtectionLevel {
    /**
     * 未知级别
     */
    CONTENT_PROTECTION_LEVEL_UNKNOWN = 0,
    /**
     * 软件安全级别
     */
    CONTENT_PROTECTION_LEVEL_SW_CRYPTO,
    /**
     * 硬件安全级别
     */
    CONTENT_PROTECTION_LEVEL_HW_CRYPTO,
    /**
     * 硬件增强级别
     */
    CONTENT_PROTECTION_LEVEL_ENHANCED_HW_CRYPTO,
    /**
     * 最大安全级别
     */
    CONTENT_PROTECTION_LEVEL_MAX,
} DRM_ContentProtectionLevel;

/**
 * @brief 许可证类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef enum DRM_MediaKeyType {
    /**
     * 离线
     */
    MEDIA_KEY_TYPE_OFFLINE = 0,
    /**
     * 在线
     */
    MEDIA_KEY_TYPE_ONLINE,
} DRM_MediaKeyType;

/**
 * @brief 许可证请求类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef enum DRM_MediaKeyRequestType {
    /**
     * 未知请求类型
     */
    MEDIA_KEY_REQUEST_TYPE_UNKNOWN = 0,
    /**
     * 初始化请求
     */
    MEDIA_KEY_REQUEST_TYPE_INITIAL,
    /**
     * 续订请求
     */
    MEDIA_KEY_REQUEST_TYPE_RENEWAL,
    /**
     * 释放请求
     */
    MEDIA_KEY_REQUEST_TYPE_RELEASE,
    /**
     * 无请求
     */
    MEDIA_KEY_REQUEST_TYPE_NONE,
    /**
     * 更新请求
     */
    MEDIA_KEY_REQUEST_TYPE_UPDATE,
} DRM_MediaKeyRequestType;

/**
 * @brief 离线许可证状态。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef enum DRM_OfflineMediaKeyStatus {
    /**
     * 未知状态
     */
    OFFLINE_MEDIA_KEY_STATUS_UNKNOWN = 0,
    /**
     * 可用状态
     */
    OFFLINE_MEDIA_KEY_STATUS_USABLE,
    /**
     * 失活状态
     */
    OFFLINE_MEDIA_KEY_STATUS_INACTIVE,
} DRM_OfflineMediaKeyStatus;

/**
 * @brief 设备证书状态类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef enum DRM_CertificateStatus {
    /**
     * 设备已安装设备证书
     */
    CERT_STATUS_PROVISIONED = 0,
    /**
     * 设备未安装设备证书
     */
    CERT_STATUS_NOT_PROVISIONED,
    /**
     * 设备证书过期
     */
    CERT_STATUS_EXPIRED,
    /**
     * 无效设备证书
     */
    CERT_STATUS_INVALID,
    /**
     * 设备证书不可用
     */
    CERT_STATUS_UNAVAILABLE,
} DRM_CertificateStatus;

/**
 * @brief 在线许可证状态。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef enum DRM_MediaKeyStatus {
    /**
     * 可用状态
     */
    MEDIA_KEY_STATUS_OK = 0,
    /**
     * 许可证不存在
     */
    MEDIA_KEY_STATUS_UNAVAILABLE = 1,
} DRM_MediaKeyStatus;

/**
 * @brief DRM uint_8 数组类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_Uint8Buffer {
    /**
     * 数组首地址
     */
    unsigned char *buffer;
    /**
     * 数组长度
     */
    uint32_t bufferLen;
} DRM_Uint8Buffer;

/**
 * @brief DRM 字符数组类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_CharBuffer {
    /**
     * 数组首地址
     */
    char *buffer;
    /**
     * 数组长度
     */
    uint32_t bufferLen;
} DRM_CharBuffer;

/**
 * @brief 字符数组类型的名值对。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_CharBufferPair {
    /* 名字 */
    DRM_CharBuffer name;
    /* 值 */
    DRM_CharBuffer value;
} DRM_CharBufferPair;

/**
 * @brief 整形数组类型的名值对。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_Uint8CharBufferPair {
    /* 名字 */
    DRM_Uint8Buffer key;
    /* 值 */
    DRM_CharBuffer value;
} DRM_Uint8CharBufferPair;

/**
 * @brief 许可证请求参数类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_MediaKeyRequestInfo {
    /**
     * 许可证类型
     */
    DRM_MediaKeyType type;
    /**
     * base64编码后的pssh数据
     */
    DRM_Uint8Buffer data;
    /**
     * 媒体类型
     */
    DRM_CharBuffer mimeType;
    /**
     * 操作数数组长度
     */
    uint32_t optionsCount;
    /**
     * 操作数数组
     */
    DRM_CharBufferPair optionsData[0];
} DRM_MediaKeyRequestInfo;

/**
 * @brief 许可证请求类型。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_MediaKeyRequest {
    /**
     * 许可证请求类型
     */
    DRM_MediaKeyRequestType type;
    /**
     * 许可证请求数据
     */
    DRM_Uint8Buffer data;
    /**
     * 许可证服务器URL
     */
    DRM_CharBuffer defaultUrl;
} DRM_MediaKeyRequest;

/**
 * @brief DRM度量统计信息。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_Statistics {
    /* 度量信息数组长度 */
    uint32_t statisticsCount;
    /* 度量信息数组 */
    DRM_CharBufferPair info[0];
} DRM_Statistics;

/**
 * @brief 离线许可证Id数组。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_MediakeyIdArray {
    /* 许可证Id数组长度 */
    uint32_t mediaKeyIdCount;
    /* 许可证Id数组 */
    DRM_Uint8Buffer mediaKeyIds[0];
} DRM_MediakeyIdArray;

/**
 * @brief 密钥信息。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_KeysInfo {
    /* 密钥信息数组长度 */
    uint32_t keysCount;
    /* 密钥信息数组 */
    DRM_Uint8CharBufferPair keysInfo[0];
} DRM_KeysInfo;

/**
 * @brief 在线许可证描述信息。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_MediaKeyDescription {
    /* 许可证信息数组长度*/
    uint32_t mediaKeyCount;
    /* 许可证信息数组 */
    DRM_CharBufferPair description[0];
} DRM_MediaKeyDescription;

/**
 * @brief DRM插件类型名。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
#define DRM_UUID_LEN 16

/**
 * @brief DRM Pssh信息。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_PsshInfo {
    /**
     * DRM插件类型名
     */
    char uuid[DRM_UUID_LEN];
    /**
     * PSSH数据长度
     */
    uint32_t dataLen;
    /**
     * PSSH数据
     */
    unsigned char *data;
} DRM_PsshInfo;

/**
 * @brief 从媒体源获取的DRM信息。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct DRM_MediaKeySystemInfo {
    /* PSSH信息数组长度 */
    uint32_t psshCount;
    /* PSSH信息数组 */
    DRM_PsshInfo psshInfo[0];
} DRM_MediaKeySystemInfo;

typedef void (*DRM_MediaKeySystemInfoCallback)(DRM_MediaKeySystemInfo* mediaKeySystemInfo);

/**
 * @brief MediaKeySystem结构体。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct MediaKeySystem MediaKeySystem;

/**
 * @brief MediaKeySession结构体。
 * @syscap SystemCapability.Multimedia.Drm.Core
 * @since 11
 * @version 1.0
 */
typedef struct MediaKeySession MediaKeySession;

#ifdef __cplusplus
}
#endif

#endif // NATIVE_DRM_COMMON_H